#include "friend.h"

Friend::Friend(QWidget *parent) : QWidget(parent)
{

    m_pShowMsgTE = new QTextEdit("显示信息 m_pShowMsgTE") ;//显示信息
    m_pInputSearchUsrNameTE = new QLineEdit;//输入要搜索的用户名框
    m_pFriendListWidget = new QListWidget;//好有列表
    m_pInputMsgLE = new QLineEdit("信息输入框 m_pInputMsgLE") ;//信息输入框

    m_pDelFriendPB = new QPushButton("删除好友");//删除好友按钮
    m_pFlushFriendPB = new QPushButton("刷新好友");//刷新好友按钮
    m_pShowOnlineUsrPB = new QPushButton("显示在线用户");//显示在线用户
    m_pSearchUsrPB = new QPushButton("搜索用户");//搜索用户

    m_pMsgSendPB = new QPushButton("发送消息");//消息发送按钮
    m_pPrivateChatPB = new QPushButton("私信聊天");//私聊按钮

    connect(m_pShowOnlineUsrPB, &QPushButton::clicked, this, &Friend::slot_m_pShowOnlineUsrPB_clicked);//绑定显示在线用户按钮
    connect(m_pSearchUsrPB, &QPushButton::clicked, this, &Friend::slot_m_pSearchUsrPB_clicked);//绑定搜索用户按钮


    //搜索输入框属性设置
    m_pInputSearchUsrNameTE->setAlignment(Qt::AlignCenter);//居中显示文本

    wordList << "jack" << "rose" << "lucy" << "rock";
    completer = new QCompleter(wordList, m_pInputSearchUsrNameTE);
    m_pInputSearchUsrNameTE->setCompleter(completer);
    m_pInputSearchUsrNameTE->setToolTip("输入搜索用户");
    m_pInputSearchUsrNameTE->setPlaceholderText("请输入搜索用户");



    //按钮加入到垂直布局中
    pRightVBL = new QVBoxLayout;
    pRightVBL->addWidget(m_pInputSearchUsrNameTE);//添加输入框搜索用户框
    pRightVBL->addWidget(m_pSearchUsrPB);//添加搜索用户按钮
    pRightVBL->addWidget(m_pDelFriendPB);//添加删除好友按钮
    pRightVBL->addWidget(m_pFlushFriendPB);//添加刷新好友按钮
    pRightVBL->addWidget(m_pShowOnlineUsrPB);//添加显示所有在线用户按钮
    pRightVBL->addWidget(m_pPrivateChatPB);//添加私聊按钮



    m_pOnline = &Online::getInstance();//单例整个项目只使用一个Online

    //显示信息和好友列表在一个水平布局
    pTopHBL = new QHBoxLayout;
    pTopHBL->addWidget(m_pFriendListWidget);
    pTopHBL->addWidget(m_pShowMsgTE);
    pTopHBL->addLayout(pRightVBL);
    pTopHBL->addWidget(m_pOnline);




    //发送消息框和发送按钮处于一个水平布局
    pMsgHBL = new QHBoxLayout;
    pMsgHBL->addWidget(m_pInputMsgLE);
    pMsgHBL->addWidget(m_pMsgSendPB);




    //把两个布局加入到一个垂直布局
    pMain = new QVBoxLayout;
    pMain->addLayout(pTopHBL);
    pMain->addLayout(pMsgHBL);

    setLayout(pMain);
    //resize(1000, 300);

}

//单例模式, 产生静态的一个操作界面, 应用程序程序只产生这一个Friend界面
Friend &Friend::getInstance()
{
    static Friend instance;
    return instance;
}

//显示所有在线用户
void Friend::showAllOnlineUsr(const PDU * pdu)
{
    if(NULL == pdu)
    {
        return;
    }
    m_pOnline->showUser(pdu);
}

//显示搜索用户查询结果
void Friend::showSearchUsr(const PDU *pdu)
{
    if(NULL == pdu)
    {
        return;
    }
    qcout << "查寻到数据" << pdu->caData[0];
    switch(pdu->caData[0])
    {
        case ENUM_SEARCH_ERROR_NAME_TYPE:
        {
            m_pInputSearchUsrNameTE->setText("用户不存在");
            break;
        }
        case ENUM_SEARCH_ONLINE_TYPE://用户在线
        {
            m_pInputSearchUsrNameTE->setText("用户在线");
            break;
        }
        case ENUM_SEARCH_OFFLINE_TYPE://用户在线
        {
            m_pInputSearchUsrNameTE->setText("用户离线");
            break;
        }
    }

}





void Friend::showOnline()
{
    if(m_pOnline->isHidden())
    {
        m_pOnline->show();
    }
    else
    {
        m_pOnline->hide();
    }
}

//按下按钮m_pShowOnlineUsrPB的槽函数, 向服务器发送查询请求
void Friend::slot_m_pShowOnlineUsrPB_clicked()
{

    //按下按钮m_pShowOnlineUsrPB的槽函数, 向OpeWidget发送信号, 槽OpeWidget::slot_Friend_signals_showOnlinePBslot接收, 用于在OpeWidget::TextEdit上显示log输出
    emit signal_m_pShowOnlineUsrPB_clicked(ENUM_FRIEND_PUSHBUTTON_m_pShowOnlineUsrPB, m_pShowOnlineUsrPB->text());

    qcout << "尝试向TcpClient发送信号";
    //按下按钮m_pShowOnlineUsrPB的槽函数, 向TcpClient发送信号, 槽TcpClient::slot_sendToServerPBOnline接收, 向服务器发送信息
    emit signals_sendToServerPBOnline();
    qcout << "向TcpClient发送信号完成";

}

//搜索用户按钮槽函数, 向服务器发送搜索用户的查询请求
void Friend::slot_m_pSearchUsrPB_clicked()
{
    qcout<< "客户端按下了搜索用户按钮";
    //按下按钮m_pSearchUsrPB的槽函数, 向OpeWidget发送信号, 槽OpeWidget::slot_Friend_signals_showOnlinePBslot接收, 用于在OpeWidget::TextEdit上显示log输出
    emit signal_m_pSearchUsrPB_clicked(ENUM_FRIEND_PUSHBUTTON_m_pSearchUsrPB, m_pSearchUsrPB->text());

    qcout << "m_pInputSearchUsrNameTE->text() = " << m_pInputSearchUsrNameTE->text();
    //按下按钮m_pSearchUsrPB的槽函数, 向TcpClient发送信号, 槽TcpClient::slot_sendToServerPB_m_pSearchUsrPB接收, 向服务器发送信息
    emit signals_sendToServerPBSearch(m_pInputSearchUsrNameTE->text());


}
